/**
  * desc：  原生存储桥接
  * author：lawrence
  * date：  2019/3/25 上午9:59
  */
import { NativeModules, Platform } from 'react-native';

const isAndroid = Platform.OS === 'android';
const handler = isAndroid ? NativeModules.RNStorage : NativeModules.RNStorageManager;

export default class RnStorageManager {

    // ======================================================
    // --- 清除、移除key值、提交
    // ======================================================
    static clear() {
        handler.clear();
    }

    static removeCache(key) {
        handler.removeCache(key);
    }

    static commit() {
        handler.commit();
    }

    // ======================================================
    // --- 字符串
    // ======================================================
    static setString(key, value) {
        if (isAndroid) {
            handler.putString(key, value)
        } else {
            handler.setString(key, value)
        }
    }

    static setStringCommit(key, value) {
        if (isAndroid) {
            handler.putStringCommit(key, value)
        } else {
            handler.setStringCommit(key, value)
        }
    }

    static getString(key, defaultValue = null) {
        return handler.getString(key, defaultValue);
    }

    // ======================================================
    // --- 布尔值
    // ======================================================
    static setBool(key, value) {
        if (isAndroid) {
            handler.putBool(key, value)
        } else {
            handler.setBool(key, value)
        }
    }

    static setBoolCommit(key, value) {
        if (isAndroid) {
            handler.putBoolCommit(key, value)
        } else {
            handler.setBoolCommit(key, value)
        }
    }

    static getBool(key, defaultValue = null) {
        return handler.getBool(key, defaultValue);
    }

    // ======================================================
    // --- 整形
    // ======================================================
    static setInt(key, value) {
        if (isAndroid) {
            handler.putInt(key, value)
        } else {
            handler.setLong(key, value)
        }
    }

    static setIntCommit(key, value) {
        if (isAndroid) {
            handler.putIntCommit(key, value)
        } else {
            handler.setLongCommit(key, value)
        }
    }

    static getInt(key, defaultValue = null) {
        return isAndroid ? handler.getInt(key, defaultValue) : handler.getLong(key, defaultValue);
    }

    // ======================================================
    // --- 长整型
    // ======================================================
    static setLong(key, value) {
        if (isAndroid) {
            handler.putLong(key, value)
        } else {
            handler.setLong(key, value)
        }
    }

    static setLongCommit(key, value) {
        if (isAndroid) {
            handler.putLongCommit(key, value)
        } else {
            handler.setLongCommit(key, value)
        }
    }

    static getLong(key, defaultValue = null) {
        return handler.getLong(key, defaultValue);
    }

    // ======================================================
    // --- 浮点型
    // ======================================================
    static setFloat(key, value) {
        if (isAndroid) {
            handler.putFloat(key, value)
        } else {
            handler.setDouble(key, value)
        }
    }

    static setFloatCommit(key, value) {
        if (isAndroid) {
            handler.putFloatCommit(key, value)
        } else {
            handler.setDoubleCommit(key, value)
        }
    }

    static getFloat(key, defaultValue = null) {
        return isAndroid ? handler.getFloat(key, defaultValue) : handler.getDouble(key, defaultValue);
    }

    // ======================================================
    // --- 对象
    // ======================================================
    static setObj(key, obj) {
        if (isAndroid) {
            const json = !!obj ? JSON.stringify(obj) : '';
            this.setStringCommit(key, json);
        } else {
            handler.setObj(key, obj);
        }
    }

    static setObjCommit(key, obj) {
        if (isAndroid) {
            const json = !!obj ? JSON.stringify(obj) : '';
            this.setStringCommit(key, json);
        } else {
            handler.setObjCommit(key, obj);
        }
    }

    static getObj(key, defaultValue = null) {
        if (isAndroid) {
            return this.getString(key, null).then(dataJson => {
                return new Promise(resolve => {
                    resolve(
                        dataJson === null ? defaultValue
                            : (dataJson === '' ? dataJson : JSON.parse(dataJson))
                    );
                });
            })
        } else {
            return handler.getObj(key, defaultValue);
        }
    }

}

